package DAO;

import Util.ConnectionUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import model.Categorias;
import model.Produto;
import model.UnidadeMedida;

public class ProdutoDAO {

    private Connection con;

    public ProdutoDAO() throws Exception {
        con = ConnectionUtil.getConn();
    }

    public void insert(Produto item) throws SQLException {
        String SQL = "INSERT INTO PRODUTO VALUES (?,?,?,?,?,?,?,?,?,?)";
        PreparedStatement stmt = con.prepareStatement(SQL);

        stmt.setInt(1, item.getCodigo());
        stmt.setInt(2, item.getCategoria().getCodigo());
        stmt.setInt(3, item.getUnidadeMedida().getCodigo());
        stmt.setString(4, item.getNome());
        stmt.setString(5, item.getDescricao());
        stmt.setDouble(6, item.getPreco());
        stmt.setDate(7, new java.sql.Date(item.getDataCadastro().getTime()));
        stmt.setBoolean(8, item.isStatus());
        stmt.setDouble(9, item.getQuantidadeMinima());
        stmt.setDouble(10, item.getQuantidade());
        stmt.execute();

    }

    public void delete(int codigo) throws SQLException {
        String SQL = "DELETE FROM PRODUTO WHERE PRD_ID = ?";
        PreparedStatement stmt = con.prepareStatement(SQL);
        stmt.setInt(1, codigo);
        stmt.execute();
    }

    public void update(Produto item) throws SQLException {
        String SQL = "UPDATE PRODUTO SET CTG_ID = ?, UNM_ID = ?, PRD_NOME = ?, PRD_DESCRICAO = ?, PRD_PRECO = ?, PRD_STATUS = ?, PRD_QUANTIDADEMINIMA = ?, PRD_QUANTIDADE = ? WHERE PRD_ID = ?";
        PreparedStatement stmt = con.prepareStatement(SQL);


        stmt.setInt(1, item.getCategoria().getCodigo());
        stmt.setInt(2, item.getUnidadeMedida().getCodigo());
        stmt.setString(3, item.getNome());
        stmt.setString(4, item.getDescricao());
        stmt.setDouble(5, item.getPreco());
        stmt.setBoolean(6, item.isStatus());
        stmt.setDouble(7, item.getQuantidadeMinima());
        stmt.setDouble(8, item.getQuantidade());
        stmt.setInt(9, item.getCodigo());
        stmt.execute();
    }

    public void updateQuantidade(double quantidade, int codigo) throws SQLException {
        String SQL = "UPDATE PRODUTO SET PRD_QUANTIDADE = ? WHERE PRD_ID = ?";
        PreparedStatement stmt = con.prepareStatement(SQL);


        stmt.setDouble(1, quantidade);
        stmt.setInt(2, codigo);
        stmt.execute();
    }
    

    public Produto findByCodigo(int codigo) throws Exception {
        String SQL = "SELECT P.PRD_ID, P.CTG_ID, C.CTG_NOME, P.UNM_ID, U.UNM_NOME, P.PRD_NOME, P.PRD_DESCRICAO, P.PRD_PRECO, P.PRD_DATACADASTRO, P.PRD_STATUS, P.PRD_QUANTIDADEMINIMA, P.PRD_QUANTIDADE FROM PRODUTO P INNER JOIN CATEGORIAS C ON P.CTG_ID = C.CTG_ID INNER JOIN UNIDADEMEDIDA U ON P.UNM_ID = U.UNM_ID WHERE PRD_ID = ?";
        PreparedStatement p = con.prepareStatement(SQL);
        p.setInt(1, codigo);

        ResultSet rs = p.executeQuery();

        if (rs.next()) {
            Produto prod = new Produto();
            prod.setCodigo(rs.getInt("PRD_ID"));
            Categorias cat = new Categorias();
            cat.setCodigo(rs.getInt("CTG_ID"));
            cat.setNome(rs.getString("CTG_NOME"));
            prod.setCategoria(cat);
            UnidadeMedida unm = new UnidadeMedida();
            unm.setCodigo(rs.getInt("UNM_ID"));
            unm.setNome(rs.getString("UNM_NOME"));
            prod.setUnidadeMedida(unm);
            prod.setNome(rs.getString("PRD_NOME"));
            prod.setDescricao(rs.getString("PRD_DESCRICAO"));
            prod.setPreco(rs.getDouble("PRD_PRECO"));
            prod.setDataCadastro(rs.getDate("PRD_DATACADASTRO"));
            prod.setStatus(rs.getBoolean("PRD_STATUS"));
            prod.setQuantidadeMinima(rs.getDouble("PRD_QUANTIDADEMINIMA"));
            prod.setQuantidade(rs.getDouble("PRD_QUANTIDADE"));
            return prod;
        } else {
            return null;
        }
    }

    public Produto findQuantidade(int codigo) throws Exception {
        String SQL = "SELECT PRD_QUANTIDADE FROM PRODUTO WHERE PRD_ID = ?";
        PreparedStatement p = con.prepareStatement(SQL);
        p.setInt(1, codigo);

        ResultSet rs = p.executeQuery();

        if (rs.next()) {
            Produto prod = new Produto();
            prod.setQuantidade(rs.getDouble("PRD_QUANTIDADE"));
            return prod;
        } else {
            return null;
        }
    }
    public Produto findQuantidadeMinQuantidade(int codigo) throws Exception {
        String SQL = "SELECT PRD_QUANTIDADE, PRD_QUANTIDADEMINIMA FROM PRODUTO WHERE PRD_ID = ?";
        PreparedStatement p = con.prepareStatement(SQL);
        p.setInt(1, codigo);

        ResultSet rs = p.executeQuery();

        if (rs.next()) {
            Produto prod = new Produto();
            prod.setQuantidade(rs.getDouble("PRD_QUANTIDADE"));
            prod.setQuantidade(rs.getDouble("PRD_QUANTIDADEMINIMA"));
            return prod;
        } else {
            return null;
        }
    }

    public List<Produto> findGrid() throws SQLException {

        String SQL = "SELECT PRD_ID, PRD_NOME, PRD_PRECO, PRD_STATUS, PRD_QUANTIDADE FROM PRODUTO WHERE 1=1";

        PreparedStatement p = con.prepareStatement(SQL);
        ResultSet rs = p.executeQuery();

        List<Produto> lsProduto = new ArrayList<>();
        while (rs.next()) {
            Produto prod = new Produto();
            prod.setCodigo(rs.getInt("PRD_ID"));
            prod.setNome(rs.getString("PRD_NOME"));
            prod.setPreco(rs.getDouble("PRD_PRECO"));
            prod.setStatus(rs.getBoolean("PRD_STATUS"));
            prod.setQuantidade(rs.getDouble("PRD_QUANTIDADE"));

            lsProduto.add(prod);
        }
        return lsProduto;
    }

    public List<Produto> findByNome(String nome) throws Exception {
        String SQL = "SELECT PRD_ID, PRD_NOME, PRD_PRECO, PRD_STATUS, PRD_QUANTIDADE FROM PRODUTO WHERE PRD_NOME LIKE ?";
        PreparedStatement p = con.prepareStatement(SQL);
        p.setString(1, "%" + nome + "%");

        ResultSet rs = p.executeQuery();

        List<Produto> lsProduto = new ArrayList<>();
        while (rs.next()) {
            Produto prod = new Produto();
            prod.setCodigo(rs.getInt("PRD_ID"));
            prod.setNome(rs.getString("PRD_NOME"));
            prod.setPreco(rs.getDouble("PRD_PRECO"));
            prod.setStatus(rs.getBoolean("PRD_STATUS"));
            prod.setQuantidade(rs.getDouble("PRD_QUANTIDADE"));
            lsProduto.add(prod);
        }
        return lsProduto;
    }

    public List<Produto> findAll() throws SQLException {

        String SQL = "SELECT PRD_ID, CTG_ID, UNM_ID, PRD_NOME, PRD_DESCRICAO, PRD_PRECO, PRD_DATACADASTRO, PRD_STATUS, PRD_QUANTIDADEMINIMA, PRD_QUANTIDADE  FROM PRODUTO WHERE 1=1";

        PreparedStatement p = con.prepareStatement(SQL);
        ResultSet rs = p.executeQuery();

        List<Produto> lsProduto = new ArrayList<>();
        while (rs.next()) {
            Produto prod = new Produto();
            prod.setCodigo(rs.getInt("PRD_ID"));
            Categorias cat = new Categorias();
            cat.setCodigo(rs.getInt("CTG_ID"));
            prod.setCategoria(cat);
            UnidadeMedida unm = new UnidadeMedida();
            unm.setCodigo(rs.getInt("UNM_ID"));
            prod.setUnidadeMedida(unm);
            prod.setNome(rs.getString("PRD_NOME"));
            prod.setDescricao(rs.getString("PRD_DESCRICAO"));
            prod.setPreco(rs.getDouble("PRD_PRECO"));
            prod.setDataCadastro(rs.getDate("PRD_DATACADASTRO"));
            prod.setStatus(rs.getBoolean("PRD_STATUS"));
            prod.setQuantidadeMinima(rs.getDouble("PRD_QUANTIDADEMINIMA"));
            prod.setQuantidade(rs.getDouble("PRD_QUANTIDADE"));
            lsProduto.add(prod);
        }
        return lsProduto;
    }
}
